![AWS CDK Workshop 日本語版をやってみた](https://devio2023-media.developers.io/wp-content/uploads/2022/08/aws-cdk.png)
AWS CDK Workshop 日本語版をやってみた
はじめに
AWS CDK Workshopに日本語翻訳版ができていました。 英語版を試したときに、途中読み飛ばしていたところもあったので、日本語版であらためてやってみました。
AWS CDK Intro Workshop | AWS CDK Workshop. https://cdkworkshop.com/ja/
日本語版はサイドメニューの言語設定欄をEnglishから日本語に変えると、日本語版に変わります。
AWS CDKとは
コードでインフラを定義して、AWS CloudFormationを通してプロビジョニングをするフレームワークです。
詳しくは以下をご参照ください。 https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html
AWS Workshopとは
AWSのサービスをハンズオン形式で学べるサイトです(基本は英語のみ)。 他にどのようなものがあるか、ご興味のある方は以下記事もご参照ください。
AWS CDK Workshopとは
AWS CDKを利用して、AWSのサービスをデプロイしていきます。 このWorkshopでは主に以下をハンズオンを通して体験できます。
- CDKをデプロイ
- URLにアクセスしたら"Hello,CDK"と表示されるアプリの作成
- URLにアクセスしたら"Hello,CDK"と表示され、アクセス回数をカウントするアプリの作成
- エラーが起きたときのログの見方
- ユニットテスト
- CDKのパイプラインを作り方
やってみた
TypeScript,Python,.NET,Java,Goがありましたが 今回、わたしはPythonを使いました。 AWS CDKを実行するローカル環境は以下の通りです。
- OS:macOS Ventura 13.0
- AWS CLI:2.8.9
- Node.js:18.12.1
- Python:3.9.11
セットアップ
このワークショプを行うためには、事前にインストールをしておくものがあるようです。以下をサクサクインストールしていきましょう。
- AWS CLI. 最新バージョン推奨
- AWS Account と IAM User
- Node.js 2022年11月9日時点ではAWS CDKはNode.js 19はサポートされていないため homebrewでインストールする場合は、サポートされているバージョンを明示的に指定して、インストールしましょう。
-
IDE VSCodeを利用します。
- AWS CDK Toolkit 以下コマンドを打ってCDKをインストールします。
$npm install -g aws-cdk
とコマンドを打てばインストールできます。
- 使用する言語 Pythonを利用します
初めての CDK プロジェクトを作成する
説明を読みながら、コードを実行しています。 日本語て書いてあるって素晴らしいですね。 Pythonのモジュールをインストールすると以下のようなファイル構成になります。
% tree cdk-workshop cdk-workshop ├── README.md ├── app.py ├── cdk.json ├── cdk_workshop │ ├── __init__.py │ └── cdk_workshop_stack.py ├── requirements-dev.txt ├── requirements.txt ├── source.bat └── tests ├── __init__.py └── unit ├── __init__.py └── test_cdk_workshop_stack.py
初めての CDK プロジェクトを作成するの章が完了するCloudFormationのスタックが二つ出来上がります。
Hello,CDK
Hello、CDKはAPI GatewayとLambdaを利用して、URLにアクセスしたら"Hello,CDK"と表示されるアプリの作成します。 途中で各種コードの説明やホットスワップデプロイの説明をします。
まずLambda関数を作っていきます。 CDKのテンプレートはcdk_workshop_stack.pyを書き換えて ルートディレクトリ配下にLambdaのディレクトリの作成し、その配下にhello.pyを作成します。 デプロイ後にブラウザでURLにアクセスするとブラウザ画面に以下が表示されれば完了です。
Good Night, CDK! You have hit /
コンストラクトを書く
次に新しいコンストラクトを定義して、アクセス数をカウントしてDynamoDBに保存するアプリを作ります。 内容はファイルはモジュールを一つ(hitcounter.py)、Lambdaハンドラー(hitcount.py )を一つ追加して、cdk_workshop_stack.py を書き換えてデプロイするというものです。
ワークショップを進めていくと途中で以下のようにエラーコードが返ってくるところがあります。
% curl -i https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/ HTTP/2 502 content-type: application/json ...
これはエラーが起きたときにどこでログを見ればいいか(CloudWatchログの見方)の解説するためにあえてエラーの状態にしています。 (個人的にここがハマりポイントで、ワークショップであえてエラーにするという認識がなくて、読み進めずに1時間くらいトラブルシューティングしてました。)
Wordkshopに沿って、コードを修正して、デプロイすると、アクセスができるようになります。
% curl -i https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/ HTTP/2 200 ...
DynamoDBで登録されていることも確認できます。
コンストラクトライブラリの利用
コンストラクトライブラリを利用して、エンドポイント経由でもDynamoDBのテーブルの中身が見れるようにしていきます。
デプロイ後に発行されてURLにアクセスすると以下のように表示されます。
アドバンスドトピック
ユニットテストとパイプラインを作成します。
ユニットテスト
ユニットテストでは、ローカルPC上でテストコードを書いて、 アサーションテストとバリデーションテストをします。
以下のような感じでPC上でユニットテストをしていきます。
% pytest ============================================================== test session starts ============================================================== platform darwin -- Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 rootdir: /Users/sakamoto.yuta/cdk-workshop plugins: typeguard-2.13.3 collected 1 item tests/unit/test_cdk_workshop.py . [100%] =============================================================== 1 passed in 2.58s ===============================================================
パイプラインの作成
CodeComitにリポジトリを作成し、CodePipelineを使ってパイプラインを作成します。CodePipelineもCDKで作ります。
リポジトリの作成で、以下コマンドがありますが、 ブランチ名を確認して、必要に応じて書き換えてください。
git push --set-upstream origin master
ちなみにわたしばブランチ名を見たら以下でした。
% git branch * main
そのため、以下のように個、コマンドを書き換えました。
% git push --set-upstream origin main
他にも pipeline_stack.py でmaster ブランチを指定しているので、 ブランチがmainの方は必要に応じてpipeline_stack.pyを書き換えてください。
うまくいくと、こんな感じでCodePipelineが起動して、デプロイ後はgit addをすると自動でデプロイしてくれます。
終わりに
所要時間は調べたながら進めたので、トータルで8時間くらいかかったような気がします。
デプロイからパイプラインまで作成できて、CDKはどういうものかイメージすることができました。CodePipelineやCodeComitは使ったことがなかったので、大満足です。
気づきとしては翻訳でなんとかなると思っていたのですが、英語を翻訳して理解するのと 日本語を読むのでは、翻訳する工数が減る文理解度が高かったような気がしました。
今度はこれを応用して、パイプラインの中にユニットテストを入れてみようと思います。
このブログが誰かの参考になれば幸いです。